Skip to main content

스트레티지 패턴

스트레티지 패턴의 정의

스트레티지 패턴이란 실행 중에 알고리즘을 선택할 수 있는 디자인 패턴이다. 스트레티지 패턴은 특정 계열들의 알고리즘들을 정의하고, 이 유사한 알고리즘들을 캡슐화한 후 알고리즘 변경이 필요할 때, 알고리즘을 직접 수정하는 게 아닌 교체하여 유연하게 확장하는 방법이다. 스트레티지 패턴은 전략 패턴이라고도 불린다.

스트레티지 패턴 예시 (java)

간단하게 덧셈, 뺄셈, 곱셈 연산을 스트레티지 패턴을 활용한 과정은 다음과 같다.

  1. Strategy 인터페이스를 생성한다.
public interface Strategy {
public int doOperation(int num1, int num2);
}
  1. Strategy 인터페이스에 세부적인 클래스들(덧셈, 뺄셈, 곱셈)을 생성한다.
/* 덧셈 */
public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
/* 뺄셈 */
public class OperationSubstract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
/* 곱셈 */
public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
  1. Context 클래스를 생성한다.
public class Context {
private Strategy strategy;

public Context(Strategy strategy){
this.strategy = strategy;
}

public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
  1. Context를 사용하여, Strategy를 변경하면 변화가 생기는지 확인한다.
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); // 10 + 5 = 15

context = new Context(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); // 10 - 5 = 5

context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); // 10 * 5 = 50
}
}

스트레티지 패턴의 장단점

  • 장점
    • 요구사항이 변경되었을 때 기존의 코드를 변경하지 않고, 새로운 전략을 추가하는 방식으로 진행하면 되기때문에 SOLID 원칙OCP (개방폐쇄의 원칙)을 준수할 수 있다.
  • 단점
    • 세부적인 전략들은 모두 Strategy 인터페이스를 공유하기 때문에 Strategy 인터페이스를 통해 들어온 인자들을 다 사용하지 않아도 되나 전달받는 상황이 발생할 수 있다. 다시 말해, Strategy와 Context 간 의사소통 오버헤드가 있다.

나올 수 있는 면접 질문

  • 스트레티지 패턴이란?
  • 스트레티지 패턴의 장단점?
  • 스트레티지 패턴이 적용되면 좋을 상황은?
    • 하나의 클래스가 많은 행동들을 정의하고, 많은 조건문의 모습을 가질 때 Strategy 패턴을 적용하면 유용하다.

참고

기여자


Junho Moon

📦